package com.hengtongxing.hejiayun.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 */

public class NumberFormatUtils {

    /**
     * setScale(1)表示保留一位小数，默认用四舍五入方式
     * 0 BigDecimal.ROUND_UP 进位处理，2.35变成2.4
     * 1 BigDecimal.ROUND_DOWN 直接删除多余的小数位，如2.35会变成2.3
     * 2 BigDecimal.ROUND_CEILING 接近正无穷大的舍入
     * 3 BigDecimal.ROUND_FLOOR 接近负无穷大的舍入，数字>0和ROUND_UP作用一样，数字<0和ROUND_DOWN作用一样
     * 4 BigDecimal.ROUND_HALF_UP 四舍五入，2.35变成2.4
     * 5 BigDecimal.ROUND_HALF_DOWN 四舍五入，2.35变成2.3，如果是5则向下舍
     * 6 BigDecimal.ROUND_HALF_EVEN 向最接近的数字舍入，如果与两个相邻数字的距离相等，则向相邻的偶数舍入。
     * 7 BigDecimal.ROUND_UNNECESSARY
     */
    /**
     * 保留 分
     */
    public static String formatDecimalPoint(String money) {
        String moneyUnit = String.valueOf(Double.parseDouble(money) * 100);
        moneyUnit = moneyUnit.substring(0, moneyUnit.indexOf("."));
        return moneyUnit;
    }

    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    public static String formatDecimal6(String value) {
        if (value.indexOf('.') > 0) {
            String[] split = value.split("\\.");
            if (split.length >= 2 && split[1].length() > 6) {
                return split[0] + "." + split[1].substring(0, 6);
            }
        }
        return value;
    }

    public static double formatDecimal(double num, int newScale, int roundingMode) {
        return new BigDecimal(num).setScale(newScale, roundingMode).doubleValue();
    }

    /**
     * 向上取整
     */
    public static Double mathCeil(double num) {
        return Math.ceil(num);
    }

    /**
     * 保留两位小数
     */
    public static String formatDecimal2(double num) {
        DecimalFormat myformat = new DecimalFormat("0.00");
        return myformat.format(num);
    }

    /**
     * 取整小数
     */
    public static String formatDouble(String money) {
        double d = Double.parseDouble(money);
        BigDecimal bg = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);
        double num = bg.doubleValue();
        if (Math.round(num) - num == 0) {
            return String.valueOf((long) num);
        }
        return String.valueOf(num);
    }

    /**
     * 取整小数
     */
    public static String formatDouble(double money) {
        BigDecimal bg = new BigDecimal(money).setScale(2, BigDecimal.ROUND_HALF_UP);
        double num = bg.doubleValue();
        if (Math.round(num) - num == 0) {
            return String.valueOf((long) num);
        }
        return String.valueOf(num);
    }

    /**
     * 保留两位小数
     */
    public static String formatTwoDecimal(String money) {
        BigDecimal bg = new BigDecimal(money);
        double f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        return String.format("%.2f", f1);
    }

    /**
     * 保留两位小数
     */
    public static String formatTwoDecimal(double money) {
        BigDecimal bg = new BigDecimal(money);
        double f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        return String.format("%.2f", f1);
    }

    /**
     * 货币格式
     * ￥12,345,678.90
     */
    public static String numberFormatMoney(String money) {
        BigDecimal bd = new BigDecimal(money);
        DecimalFormat df = new DecimalFormat("#,###.00");
        return df.format(bd);
    }

    /**
     * 格式化精度
     *
     * @param v
     * @param point 小数位数
     * @return double
     */
    public static Double format(double v, int point) {
        BigDecimal b = new BigDecimal(v);
        return b.setScale(point, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


    /**
     * BigDecimal 相加
     *
     * @param v1
     * @param v2
     * @return double
     */
    public static Double add(double v1, double v2) {
        BigDecimal n1 = new BigDecimal(Double.toString(v1));
        BigDecimal n2 = new BigDecimal(Double.toString(v2));
        return n1.add(n2).doubleValue();
    }

    /**
     * BigDecimal 相减
     *
     * @param v1
     * @param v2
     * @return double
     */
    public static Double subtract(double v1, double v2) {
        BigDecimal n1 = new BigDecimal(Double.toString(v1));
        BigDecimal n2 = new BigDecimal(Double.toString(v2));
        return n1.subtract(n2).doubleValue();
    }

    /**
     * BigDecimal 相乘
     *
     * @param v1
     * @param v2
     * @return double
     */
    public static Double multiply(double v1, double v2) {
        BigDecimal n1 = new BigDecimal(Double.toString(v1));
        BigDecimal n2 = new BigDecimal(Double.toString(v2));
        return n1.multiply(n2).doubleValue();
    }

    /**
     * BigDecimal 相除
     *
     * @param v1
     * @param v2
     * @return double
     */
    public static Double divide(double v1, double v2) {
        BigDecimal n1 = new BigDecimal(Double.toString(v1));
        BigDecimal n2 = new BigDecimal(Double.toString(v2));
        return n1.divide(n2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 比较大小 小于0：v1 < v2 大于0：v1 > v2 等于0：v1 = v2
     *
     * @param v1
     * @param v2
     * @return
     */
    public static int compare(double v1, double v2) {
        BigDecimal n1 = new BigDecimal(Double.toString(v1));
        BigDecimal n2 = new BigDecimal(Double.toString(v2));
        return n1.compareTo(n2);
    }

    /**
     * 四舍五入格式化
     *
     * @param v
     * @param point
     * @return
     */
    public static Double formatRoundUp(double v, int point) {
        NumberFormat nf = NumberFormat.getInstance();
        nf.setRoundingMode(RoundingMode.HALF_UP);//设置四舍五入
        nf.setMinimumFractionDigits(point);//设置最小保留几位小数
        nf.setMaximumFractionDigits(point);//设置最大保留几位小数
        return Double.valueOf(nf.format(v));
    }

}
